package com.xzit.rental.utils;

import com.xzit.rental.entity.Permission;
import com.xzit.rental.vo.RouteVo;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * 基于权限列表和父权限ID构建具有层次结构的路由树信息
 */
public class RouteTreeUtils {
    public static List<RouteVo> buildRouteTree(List<Permission> permissionList,int pid) {
        List<RouteVo> routeVoList = new ArrayList<>();
        // 处理权限列表为空的情况并开始流处理
        Optional.ofNullable(permissionList).orElse(new ArrayList<>())
                .stream()
                // 过滤条件是当前权限对象不为null并且其pid（父节点 ID）属性等于传入的pid参数值，这样就筛选出了以给定pid作为父节点的那些权限对象。
                .filter(permission -> permission!=null && permission.getPid() == pid)
                .forEach(permission -> {
                    // 创建一个新的RouteVo对象，这个对象将代表路由树中的一个节点
                    RouteVo routeVo = new RouteVo();
                    routeVo.setPath(permission.getRoutePath());
                    routeVo.setName(permission.getRouteName());
                    // 根据当前Permission对象的pid值判断是否是顶级节点（pid为0通常表示顶级节点）
                    if(permission.getPid()==0){
                        routeVo.setComponent("Layout");
                        routeVo.setAlwaysShow(true);
                    }else {
                        routeVo.setComponent(permission.getRouteUrl());
                        routeVo.setAlwaysShow(false);
                    }
                    // 调用RouteVo内部的Meta构造函数创建一个Meta对象
                    routeVo.setMeta(routeVo.new Meta(permission.getPermissionLabel(),
                            permission.getIcon(),
                            permission.getPermissionCode().split(",")));
                    List<RouteVo> children = buildRouteTree(permissionList, permission.getId());
                    routeVo.setChildren(children);

                    // 把构建好的当前RouteVo对象添加到routeVoList中，这个列表用于存储整个路由树的节点信息。
                    routeVoList.add(routeVo);

                });

        return routeVoList;
    }

    public static List<Permission> buildMenuTree(List<Permission> permissionList,int pid) {
        List<Permission> menuList = new ArrayList<>();
        Optional.ofNullable(permissionList).orElse(new ArrayList<>())
                .stream()
                .filter(permission -> permission!=null && permission.getPid() == pid)
                .forEach(permission -> {
                    Permission menu = new Permission();
                    BeanUtils.copyProperties(permission, menu);
                    menuList.add(menu);
                    menu.setChildren(buildMenuTree(permissionList, permission.getId()));
                });
        return menuList;
    }

}
